/*
 * @(#)PageEvent.java
 *
 * Copyright 2002 - 2003 JIDE Software Inc. All rights reserved.
 */
package com.element.ui.dialog;

import java.awt.*;
import java.util.EventObject;

/**
 * An <code>EventObject</code> that adds support for <code>AbstractPage</code> objects as the event source.
 */
public class PageEvent extends EventObject {
	/**
	 * The first number in the range of IDs used for <code>AbstractPage</code> events.
	 */
	public static final int PAGE_EVENT_FIRST = AWTEvent.RESERVED_ID_MAX + 1200;

	/**
	 * The last number in the range of IDs used for <code>AbstractPage</code> events.
	 */
	public static final int PAGE_EVENT_LAST = PAGE_EVENT_FIRST + 4;

	/**
	 * This event is delivered when the the data becomes invalid.
	 */
	public static final int PAGE_OPENED = PAGE_EVENT_FIRST;

	/**
	 * This event is delivered when the page is about to close. This event can be listened if you want to do some
	 * validation on the page before it is closed. If it fails the validation, you can call
	 * <code>AbstractPage#setAllowClosing(false)</code> to stop the closing process. The source of the event will tell
	 * you which button originated the page closing event. For example, in the Wizard, the next button, the previous
	 * button, the cancel button or the finish button all can trigger page closing event. The event's source will be the
	 * actual button. You can call button.getName() and compare it with the predefined button names defined in {@link
	 * ButtonNames} to find out which button it is.
	 */
	public static final int PAGE_CLOSING = 1 + PAGE_EVENT_FIRST;

	/**
	 * This event is delivered when the page is closed.
	 */
	public static final int PAGE_CLOSED = 2 + PAGE_EVENT_FIRST;

	private int _id;

	/**
	 * Constructs an <code>AbstractPageEvent</code> object.
	 *
	 * @param source the <code>AbstractPage</code> object that originated the event
	 * @param id     an integer indicating the type of event
	 */
	public PageEvent(Object source, int id) {
		super(source);
		_id = id;
	}

	/**
	 * Returns a parameter string identifying this event. This method is useful for event logging and for debugging.
	 *
	 * @return a string identifying the event and its attributes
	 */
	public String paramString() {
		return switch (_id) {
			case PAGE_OPENED -> "PAGE_OPENED";
			case PAGE_CLOSING -> "PAGE_CLOSING";
			case PAGE_CLOSED -> "PAGE_CLOSED";
			default -> "PAGE_EVENT_UNKNOWN";
		};
	}

	/**
	 * Returns the event type.
	 *
	 * @return event id.
	 */
	public int getID() {
		return _id;
	}

	/**
	 * Sets the event type.
	 *
	 * @param id the new event type.
	 */
	public void setID(int id) {
		_id = id;
	}

	@Override
	public String toString() {
		return "PageEvent{" +
				"id=" + paramString() +
				"}";
	}
}
